package br.com.ifba.sadd.admin.presentation.curso {
	import br.com.ifba.sadd.model.Disciplina;
	import br.com.ifba.sadd.model.Modalidade;
	import br.com.ifba.sadd.model.ModelLocator;
	import br.com.ifba.sadd.model.ServiceLocator;

	import mx.collections.ArrayCollection;
	import mx.controls.Alert;
	import mx.events.ValidationResultEvent;
	import mx.rpc.AsyncToken;
	import mx.rpc.Responder;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;

	import flash.events.Event;

	[Event(name="reset", type="flash.events.Event")]
	
	[Bindable]
	public class AlterarCursoPresentationModel
	{
		
		
		private var _enable:Boolean = false;
		private var _model:ModelLocator = ModelLocator.getInstance();
		private var _modalidades:ArrayCollection = new ArrayCollection();
		private var _disciplinas:ArrayCollection = new ArrayCollection();
		private var _service:ServiceLocator = ServiceLocator.getInstance();
		private var _gradeCurricular:ArrayCollection = new ArrayCollection();

		
		public function AlterarCursoPresentationModel()
		{
		}
		
		/* ----------------- Geters e Seters ------------------*/
		
		public function get model():ModelLocator
		{
			return _model;
		}
		
		public function get enable():Boolean
		{
			return _enable;
		}
		
		public function set enable(value:Boolean):void
		{
			_enable = value;
		}

		[ArrayElementType("br.com.ifba.sadd.model.Disciplina")]
		public function get gradeCurricular():ArrayCollection
		{
			return _gradeCurricular;
		}
		
		public function set gradeCurricular(value:ArrayCollection):void
		{
			_gradeCurricular = value;
		}

		[ArrayElementType("br.com.ifba.sadd.model.Modalidade")]
		public function get modalidades():ArrayCollection
		{
			return _modalidades;
		}
		
		public function set modalidades(value:ArrayCollection):void
		{
			_modalidades = value;
		}
		
		[ArrayElementType("br.com.ifba.sadd.model.Disciplina")]
		public function get disciplinas():ArrayCollection
		{
			return _disciplinas;
		}
		
		public function set disciplinas(value:ArrayCollection):void
		{
			_disciplinas = value;
		}
				
		/* --------------------- Funções de Crud ----------------------*/
		
			
		public function alterar(nome:String, modalidade:Modalidade):void
		{
			model.curso.modalidade = modalidade;
			model.curso.nome = nome.toUpperCase();
			model.curso.matrizCurricular;
			var token:AsyncToken = _service.cursoService.alterarCurso(model.curso);
			token.addResponder(new Responder(handleAlterar, handleFailure));
		}		
		

		/* ---------------------- Funções de Apoio ----------------------*/
		
			
		public function initAlterar():void
		{
			listarModalidades();
			listarDisciplinas();
			gradeCurricular = model.curso.matrizCurricular;
		}
		
		private function listarModalidades():void
		{
			var token:AsyncToken = _service.modalidadeService.listarModalidades();
			token.addResponder(new Responder(handleModalidades, handleFailure));
		}
		
		private function listarDisciplinas():void
		{
			var token:AsyncToken = _service.disciplinaService.listarDisciplinas();
			token.addResponder(new Responder(handleDisciplinas, handleFailure));
		}
					
		public function validarCadastro(string:ValidationResultEvent, number:ValidationResultEvent):void
		{
			if((string.type == ValidationResultEvent.VALID) && (number.type == ValidationResultEvent.VALID))
			{
				enable = true;
			}
			else{
				enable = false;
			}	
		}
		
		public function adicionarNaGrade(disciplina:Disciplina):void
		{
			if(disciplina != null){
				var existe:Boolean = false;
				for each (var pd:Disciplina in gradeCurricular)
				{
					if(pd.nome == disciplina.nome)
					{
						Alert.show("Disciplina já adicionada");
						existe = true;
						break;
					}
					else
					{
						existe = false;
					}
					
				}
				if(!existe){
					gradeCurricular.addItem(disciplina);
				}
			}
			else{
				Alert.show("Selecione uma disciplina e um professor");
			}
			
		}
		
		public function removerDaGrade(index:int):void
		{
			if(index < 0)
			{
				Alert.show("Selecione uma disciplina");
			}
			else{				
				gradeCurricular.removeItemAt(index);
			}

		}
		
		/* ------------------------ handles ------------------------*/
		
		
		private function handleModalidades(list:ResultEvent):void
		{
			modalidades = list.result as ArrayCollection;
		}
		
		private function handleDisciplinas(list:ResultEvent):void
		{
			disciplinas = list.result as ArrayCollection;
		}
			
		private function handleFailure(event:FaultEvent):void
		{
			Alert.show(event.fault.faultString, "Erro!");
		}
		
		private function handleInserir(event:ResultEvent):void
		{			
			Alert.show("Cadastro inserido com sucesso!");
			dispatchEvent(new Event("reset"));
		}
		
		private function handleAlterar(event:ResultEvent):void
		{			
			Alert.show("Cadastro alterado com sucesso");
			dispatchEvent(new Event("reset"));
		}
	}
}